home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 1.toast / Sample Code / Archive / QuickTime / QuickTime VR / Make QTVR Panorama / CPreferences.cp < prev    next >
Encoding:
Text File  |  2000-09-28  |  3.4 KB  |  206 lines  |  [TEXT/CWIE]

  1. /*
  2.     Implements a preference file and resource io therein. Also handy
  3.     for resource io in any LFile.
  4.  
  5.     Created 29 Jan 1996 by EGH
  6.     
  7.     Copyright © 1996, Apple Computer, Inc. All rights reserved.
  8. */
  9.  
  10. #include <String_Utils.h>
  11.  
  12. #include "CPreferences.h"
  13.  
  14. CPreferences::CPreferences()
  15. {
  16.     mFile = nil;
  17.     mOwnsFile = true;
  18. }
  19.  
  20. CPreferences::CPreferences(
  21.     LFile *inFile)
  22. {
  23.     mFile = inFile;
  24.     mOwnsFile = false;
  25. }
  26.  
  27. CPreferences::CPreferences(
  28.     OSType inFileType,
  29.     OSType inFileCreator,
  30.     StringPtr inFileNameP)
  31. {
  32.     mFile = nil;
  33.     mOwnsFile = true;
  34.     FindOrCreatePreferencesFile(inFileType, inFileCreator, inFileNameP);
  35. }
  36.  
  37. CPreferences::~CPreferences()
  38. {
  39.     if (mOwnsFile && mFile != nil)
  40.         delete mFile;
  41. }
  42.  
  43. void CPreferences::FindOrCreatePreferencesFile(
  44.     OSType inFileType,
  45.     OSType inFileCreator,
  46.     StringPtr inFileNameP)
  47. {
  48.     OSErr err = noErr;
  49.     FSSpec spec;
  50.     
  51.     err = FindFolder(
  52.         kOnSystemDisk,
  53.         kPreferencesFolderType,
  54.         true,
  55.         &spec.vRefNum,
  56.         &spec.parID);
  57.     
  58.     if (err == noErr)
  59.     {
  60.         CopyPStr(inFileNameP, spec.name, sizeof(spec.name));
  61.         
  62.         mFile = new LFile(spec);
  63.         
  64.         SetDebugThrow_(debugAction_Nothing); // turn this off as below will probably be thrown
  65.         
  66.         Try_
  67.         {
  68.             mFile->CreateNewFile(inFileCreator, inFileType, nil);
  69.         }
  70.         Catch_(inErr)
  71.         {
  72.             if (inErr != dupFNErr)
  73.             {
  74.                 delete mFile;
  75.                 mFile = nil;
  76.             }
  77.             
  78.             // fall through
  79.         }
  80.         EndCatch_
  81.         
  82.         SetDebugThrow_(debugAction_Alert);
  83.     }
  84. }
  85.  
  86. Handle CPreferences::GetPreferenceResource(
  87.     OSType inResType,
  88.     ResIDT inResID)
  89. {
  90.     Handle resH = nil;
  91.     
  92.     if (mFile != nil)
  93.     {
  94.         Int16
  95.             saveResRef,
  96.             resRef;
  97.         
  98.         Try_
  99.         {
  100.             saveResRef = ::CurResFile();
  101.             
  102.             SetDebugThrow_(debugAction_Nothing); // don't bitch unecessarily
  103.             resRef = mFile->OpenResourceFork(fsRdPerm);
  104.             SetDebugThrow_(debugAction_Alert); // ok, start bitching again
  105.             
  106.             ::UseResFile(resRef); // to force this file to the head of the chain…
  107.             
  108.             resH = ::Get1Resource(inResType, inResID); // …so that Get1 can be used
  109.             
  110.                 // the resource fork will be closed, so detach it so we don't lose it
  111.             if (resH != nil)
  112.             {
  113.                 ::HNoPurge(resH);
  114.                 ::DetachResource(resH);
  115.             }
  116.             
  117.             mFile->CloseResourceFork();
  118.             ::UseResFile(saveResRef);
  119.         }
  120.         
  121.         Catch_(inErr)
  122.         {
  123.             ::UseResFile(saveResRef);
  124.             
  125.             // fall through
  126.         } EndCatch_
  127.     }
  128.     
  129.     return resH;
  130. }
  131.  
  132. void CPreferences::SavePreferenceResource(
  133.     OSType inResType,
  134.     ResIDT inResID,
  135.     Handle inPrefH)
  136. {
  137.     if (mFile != nil)
  138.     {
  139.         Int16
  140.             saveResRef,
  141.             resRef;
  142.         Handle resH;
  143.         
  144.         Try_
  145.         {
  146.             saveResRef = ::CurResFile();
  147.             
  148.             resRef = mFile->OpenResourceFork(fsRdWrPerm);
  149.             ::UseResFile(resRef); // to force this file to the head of the chain…
  150.             
  151.             resH = ::Get1Resource(inResType, inResID); // …so that Get1 can be used
  152.             
  153.                 // if the resource already exists, update the old one
  154.             if (resH != nil)
  155.             {
  156.                 ::HNoPurge(resH);
  157.                 ::SetHandleSize(resH, GetHandleSize(inPrefH));
  158.                 ::BlockMove(*inPrefH, *resH, GetHandleSize(resH));
  159.                 if (::ResError() == noErr)
  160.                 {
  161.                     ::ChangedResource(resH);
  162.                     if (::ResError() == noErr)
  163.                     {
  164.                         ::WriteResource(resH);
  165.                         if (::ResError() == noErr)
  166.                             ::ReleaseResource(resH);
  167.                     }
  168.                 }
  169.             }
  170.             else
  171.             {
  172.                 ::AddResource(inPrefH, inResType, inResID, "\p");
  173.                 if (::ResError() == noErr)
  174.                 {
  175.                     ::WriteResource(inPrefH);
  176.                     ::DetachResource(inPrefH); // do not throw the handle
  177.                 }
  178.             }
  179.             
  180.             mFile->CloseResourceFork();
  181.             ::UseResFile(saveResRef);
  182.         }
  183.         
  184.         Catch_(inErr)
  185.         {
  186.             ::UseResFile(saveResRef);
  187.             
  188.             // fall through
  189.         } EndCatch_
  190.     }
  191. }
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.